根據AAA法則,可維持「測試」程式碼的可讀性、和可維護性,任何人看了unit test內容即能一目了然要測試項目和預期結果。
例如:
it('should create', () => {
// arrange
const txt = 'Hello world';
const txtElem = element.querySelector('.data-test');
// act
component.txt = txt;
fixture.detectChanges();
// assert
expert(txtElem.textContent).toContain(txt);
})
除了follow 3A之外,撰寫測試的時候,可以先用註解寫下測試步驟,在依序實現測試案例,會有助於撰寫測試案例的思考方向,且更為專注單一測項上。
舉例:
describe('DataService', () => {
beforeEach( ()=> TestBed.configureTestingModule({}));
it('should return the list of homes', () => {
// 1.Spy on and mock the HttpClient
// then do sth...
// 2.Use our service to get homes
// then do sth...
// 3.Verify that the service returned mocked data
// then do sth...
// 4.Verify that the service called the proper HTTP endpoint
// then do sth...
})
})
一開始可能會覺得:「啊!好想趕快把功能寫完,可以用舊好了」,或者「阿!我知道測試很重要,但先完成功能實做,回頭再補好了」。
通常有這種聲音出現,就表示「撰寫測試」這件事就沒有然後了。
曾聽說:「當覺得不適應的時候,代表已經在改變的過程中,習慣它、面對它、接受它」
所以,頭先洗下去吧!(笑)
「小孩才做選擇,我全都要」這樣的話還蠻常聽到的,當開發到忘我的時候,會忘記個別實現功能的重要,而不是只追求程式碼可以run就好。
當程式碼隨時間變複雜,勢必要重構再重構,所以將功能獨立出來就顯得重要,在「測試的世界」也是,這也像SOLID的S -> Single Responsibility Principle (SRP) 單一執行原則。
一個功能,只做一件事,專注執行那一件事,其實不只「實現」、「測試」,學習也是。
所以,「專注做好一件事」。
下一篇要進入「名詞介紹」